package cn.itcast.bos.web.action.common;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import org.springframework.data.domain.Page;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
    // 模型驱动
    protected T model;

    @Override
    public T getModel() {
        // TODO Auto-generated method stub
        return model;
    }

    // 通过构造器完成对model的初始化
    public BaseAction() {
        // 通过子类对象获取父类对象的泛型
        // 1.this.getClass()通过子类对象获取父类对象getGenericSuperclass获取父类对象的类型
        Type superclass = this.getClass().getGenericSuperclass();
        // ParameterizedType代表一个参数化的类型
        ParameterizedType parameterizedType = (ParameterizedType) superclass;
        // 子类类型 ----父类类型
        // getActualTypeArguments返回一个数组{ @code类型}表示实际的对象类型,*一个参数化的类型。
        // 返回表示此类型实际类型参数的 Type 对象的数组
        Class<T> modelClass = (Class<T>) parameterizedType.getActualTypeArguments()[0];
        try {
            model = modelClass.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("模型驱动失败");
        }
    }

    protected int rows;
    protected int page;

    public void setRows(int rows) {
        this.rows = rows;
    }

    public void setPage(int page) {
        this.page = page;
    }

    // 将结果集压入值栈中
    protected void pushPageDataToValueStack(Page<T> pageData) {

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("total", pageData.getTotalElements());
        map.put("rows", pageData.getContent());
        ActionContext.getContext().getValueStack().push(map);
    }

}
